perm filename GETTIM.SAI[AL,HE] blob sn#744184 filedate 1984-02-23 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00002 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	BEGIN "PUPSUB"
C00011 ENDMK
C⊗;
BEGIN "PUPSUB"

DEFINE ! = " COMMENT ";

! Definitions for using PUPs;

! Constants concerning PUP data structure;
DEFINE MAXPUPWORDS = 139;	! Maximum PUP is 554 bytes;
DEFINE PUPOVERHEAD = 22;	! Number of non-data bytes in a PUP;

! MTAPE UUO opcodes;
DEFINE PUPLISTEN = 1;
DEFINE SKIPREADY = '10;

! Well-known socket numbers;
DEFINE MISCSERV = 4;

! PUP types;
DEFINE TIMEREQUEST = '200;
DEFINE TIMEREPLY = '201;

DEFINE	CRLF="('15&'12)";

PROCEDURE SNOOZE(INTEGER TIME(0));
! sleeps for 1/60 of a second (until next tick, I guess);
! unless argument is nonzero, then it sleeps that many seconds;

BEGIN "SNOOZE"
   QUICK_CODE "SLEEP"
      MOVE '13,TIME;
      CALLI '13,'31
   END "SLEEP";
END "SNOOZE";  ! what a kludge;

STRING TIME;
INTEGER ARRAY HOSTSOCKET[0:5];
BOOLEAN FOUND;
EXTERNAL INTEGER _SKIP_;
INTEGER ARRAY PUP[0:MAXPUPWORDS];
INTEGER ARRAY MTP[0:6];
INTEGER OPCODE,COUNT,BRCHAR,EOF,LEN,PUPCHN,I,J,PTR,NCHAR,HOST,PUPS,NET;
BOOLEAN GOTIT;

! Call the time-of-day server for the current time.;

    PUPS ← 0;
    PUPCHN ← GETCHAN;
    EOF ← 1;
    OPEN(PUPCHN,"PUP",'15,0,0,COUNT,BRCHAR,EOF);
    IF EOF NEQ 0 THEN
	BEGIN
	    FOUND ← FALSE;
	    PRINT("OPEN failed on PUP"&CRLF);
	END
    ELSE BEGIN   ! Set up an MTAPE to open a connection with the misc. services;
    MTP[0] ← PUPLISTEN; ! Function;
    MTP[2] ← -1; ! Local socket number (generate one);
    MTP[3] ← 0; ! Wait flag;
    MTP[4] ← 8; ! Byte size;
    MTP[5] ← MISCSERV; ! Remote socket number (misc. services);
    MTP[6] ← -1; ! Remote host (broadcast);
    ! Set up MTAPE uuo...;
    OPCODE ← '072000000000 + (PUPCHN LSH 23);
    CODE(OPCODE,MTP[0]);
    IF MTP[1] NEQ 0 THEN
	BEGIN
	    FOUND ← FALSE;
	    PRINT("Failed to connect to time-of-day server");
	END
    ELSE BEGIN
    ! Set up the PUP to send the time request;
    DPB(TIMEREQUEST,POINT(16,PUP[0],31)); ! PUP type;
    FOR I ← 1 STEP 1 UNTIL 4 DO PUP[I] ← 0; ! Let WAITS fill in the rest;
    ARRYOUT(PUPCHN,PUP[0],(PUPOVERHEAD+3) DIV 4);
    IF EOF NEQ 0 THEN
	BEGIN
	    FOUND ← FALSE;
	    PRINT("Output to PUP failed"&CRLF);
	END
    ELSE
      BEGIN
      ! Get reply from misc. server;
      MTP[0] ← SKIPREADY;
      CODE(OPCODE,MTP[0]);
      IF _SKIP_ = 0 THEN
	  BEGIN
	      SNOOZE(1);
	      CODE(OPCODE,MTP[0]);
	      IF _SKIP_ = 0 THEN
		  BEGIN
		      SNOOZE(1);
		      CODE(OPCODE,MTP[0]);
		      IF _SKIP_ = 0 THEN
			  GOTIT ← FALSE
		      ELSE
			  GOTIT ← TRUE
		  END
	      ELSE
		  GOTIT ← TRUE
	  END
      ELSE
	  GOTIT ← TRUE;
      IF NOT GOTIT THEN
	  BEGIN
	      FOUND ← FALSE;
	      PRINT("No reply from time server"&CRLF);
	  END
      ELSE
	BEGIN
	! Receive the PUP;
	ARRYIN(PUPCHN,PUP[0],MAXPUPWORDS);
	! Extract PUP type, check if successful;
	IF LDB(POINT(8,PUP[0],31)) = TIMEREPLY THEN
	    BEGIN
		FOUND ← TRUE;
		LEN ← LDB(POINT(16,PUP[0],15))-PUPOVERHEAD;
		PTR ← POINT(8,PUP[5],-1);
		TIME ← NULL;
		FOR I ← 1 STEP 1 UNTIL LEN DO TIME ← TIME & ILDB(PTR);
		PRINT(LEN,"  '",TIME,"'",CRLF);
	    END;
	END
      END
    END END;
    RELEASE(PUPCHN);

END "PUPSUB"